package tracksystem;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Serialized;

import managesystem.Buddy;

/**
 * Een activiteit
 * 
 * @author Incalza Dario & Janssens Jannes
 * 
 */
@Entity
public class Activity implements Serializable{
        
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private String place;
        private String description;
        @Serialized
        private List<Buddy> buddies = new ArrayList<Buddy>();
        private int rating;
        private String comment;
        @Serialized
        private ArrayList<String> distractions = new ArrayList<String>();
        private String type; // "hoorcollege", "oefenzitting" of "zelfstudie".
        @Serialized
        private ArrayList<String> aidTools = new ArrayList<String>();
        private Date startDate;
        private Date stopDate = null;

        protected Activity() // nodig voor objectify
        {

        }

        /**
         * Een nieuwe activiteit aanmaken.
         * @param duration
         * @param place
         * @param description
         * @param rating
         * @param type
         * @param comment
         */
        public Activity(Date startDate, Date stopDate, String place,
                        String description, int rating, String type, String comment) {
                this.startDate =startDate;
                this.stopDate = stopDate;
                this.place = place;
                this.description = description;
                this.rating = rating;
                this.type = type;
                this.comment = comment;

        }

        public Activity(Date startDate) {
                this.startDate = startDate;
        }

        /**
         * retourneert de plaats
         * 
         * @return String
         */
        public String getPlace() {
                return place;
        }

        /**
         * retourneert de beschrijving
         * 
         * @return
         */
        public String getDescription() {
                return description;
        }

        /**
         * retourneert de maatjes
         * 
         * @return arraylist van maatjes
         */
        public Collection<Buddy> getBuddylist() {
                return buddies;
        }

        /**
         * retourneert de rating
         * 
         * @return rating
         */
        public int getRating() {
                return rating;
        }

        /**
         * retourneert de commentaar op de activiteit
         * 
         * @return commentaar
         */
        public String getComment() {
                return comment;
        }

        /**
         * retourneert de afleidingen
         * 
         * @return arraylist met afleidingen
         */
        public ArrayList<String> getDistractions() {
                return distractions;
        }

        /**
         * retourneert het type van de activiteit
         * 
         * @return een string met type activiteit
         */
        public String getType() {
                return type;
        }

        /**
         * retourneert gebruikte hulpmiddelen
         * 
         * @return een array met hulpmiddelen
         */
        public ArrayList<String> getAidTools() {
                return aidTools;
        }

        /**
         * voegt een maatje toe
         * 
         * @param buddy
         *            een student object
         */
        public void addBuddy(Buddy b) {
                buddies.add(b);
        }

        /**
         * zet een commentaar bij de activiteit
         * 
         * @param comment
         *            string met commentaar
         */
        public void setComment(String comment) {
                this.comment = comment;
        }

        /**
         * Voegt een ongebruikte afleiding toe aan de arraylist van afleidingen
         * 
         * @param distraction
         *            een string van een afleiding
         */
        public void setDistraction(String distraction) {
                boolean usedDistraction = false;
                for (int i = 0; i < distractions.size(); i++) {
                        if (distractions.get(i).equals(distraction)) {
                            usedDistraction = true;
                    }
            }
            if (usedDistraction == false) {
                    distractions.add(distraction);
            }
    }

    /**
     * voegt een ongebruikt hulpmiddel toe aan de arraylist met hulpmiddelen
     * 
     * @param aidTool
     *            een string van een hulpmiddel
     */
    public void setAidTool(String aidTool) {
            boolean usedAid = false;
            for (int i = 0; i < aidTools.size(); i++) {
                    if (aidTools.get(i).equals(aidTool)) {
                            usedAid = true;
                    }
            }
            if (usedAid == false) {
                    aidTools.add(aidTool);
            }
    }

    /**
     * geeft de startdatum van de activiteit terug
     * 
     * @return Date de startdatum
     */
    public Date getStart() {
            return startDate;
    }


    public Date getStopDate() {
            return stopDate;
    }

    public void setStopDate(Date stopDate) {
            this.stopDate = stopDate;
    } 
    
    public void setStopDate(int seconds)
    {
            Calendar cal  = Calendar.getInstance();
            cal.setTime(this.startDate);
            cal.add(Calendar.SECOND, seconds);
            this.stopDate = cal.getTime();
    }
    
    /**
     * If a stopdate is set already,
     * gives the duration from this activity (in ms)
     * (stopDate - startDate = duration)
     * @return int duration in miliseconds.
     */
    public Long getDuration()
    {
            if(stopDate!=null)
            {       
                    return stopDate.getTime()-startDate.getTime();
            }
            else
            {       
                    return null;
            }
    }

    /**
     * @param rating the rating to set
     */
    public void setRating(int rating) {
            this.rating = rating;
    }

    /**
     * @param place the place to set
     */
    public void setPlace(String place) {
            this.place = place;
    }

    /**
     * @param type the type to set
     */
    public void setType(String type) {
            this.type = type;
    }

    /**
     * @param description the description to set
     */
    public void setDescription(String description) {
            this.description = description;
    }

    public void setDistractions(String[] distr) {
            if(!distr.equals(null)){
                    this.distractions = new ArrayList<String>(Arrays.asList(distr));
            }
    }

    public void setAids(String[] aids) {
            if(!aids.equals(null)){
                    this.aidTools = new ArrayList<String>(Arrays.asList(aids));
            }
    }
    
    public void setBuddies(List<Buddy> buddies){
            this.buddies = (ArrayList<Buddy>) buddies;
    }

}
